home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / scope / 001-025 / scopedisk6 / atoolsm2 / ademo.mod < prev    next >
Text File  |  1995-03-18  |  6KB  |  182 lines

  1. MODULE AudioDemo;       (* test of the AudioTool library module routines *)
  2.                         (* adapted to M2Amiga Modula-2 by Anthony Bryant *)
  3. FROM SYSTEM IMPORT
  4.  ADR,ADDRESS,BYTE,FFP;
  5. FROM AudioTools IMPORT
  6.  InitAudio, GetChannel, StopChannel, StartChannel,
  7.  SetPV, SetWave, SetSamp, PlayNote, PlayFreq,
  8.  MayGetNote, PlaySamp, CheckIfDone, FinishAudio;
  9. FROM Dos IMPORT
  10.  Delay;
  11. FROM Exec IMPORT
  12.  Byte, UByte, MsgPortPtr;
  13. FROM RandomNumber IMPORT
  14.  RND; 
  15. FROM Terminal IMPORT
  16.  WriteLn, WriteString;
  17.  
  18. TYPE
  19.   waveArray = ARRAY [0..255] OF BYTE;
  20. CONST
  21.   noiselen = 1024;    
  22. VAR
  23.    i: CARDINAL;
  24.    channel, error, myid: LONGINT;
  25.    myport:  MsgPortPtr;
  26.    sawtooth: waveArray;
  27.    triangle: waveArray;
  28.    square:   waveArray;
  29.    sinewave: waveArray;
  30.    noise:   ARRAY [0..noiselen-1] OF BYTE;
  31.    noiseptr: ADDRESS;
  32.    
  33. PROCEDURE MakeWaveArrays;
  34.  VAR
  35.    i: INTEGER;  (* index to waveArray *)
  36.    trv,sqv: Byte;
  37.    sine,cosine,step: FFP; (* Fast Floating Point *)
  38.  BEGIN
  39.    trv:=0; sqv:=127;
  40.    sine:=0.0; cosine:=1.0; step:=0.0247;
  41.    FOR i:=0 TO 255 BY 1 DO
  42.      sawtooth[i]:= Byte(127 - i);
  43.      triangle[i]:= Byte(trv);
  44.      square[i]:=   Byte(sqv);
  45.      sinewave[i]:= Byte(INTEGER(127.0 * sine));
  46.      IF (i>62) AND (i<190) THEN DEC(trv,2); ELSE INC(trv,2); END;
  47.      IF (i>127) THEN sqv:=-128; END;
  48.      cosine:= cosine - (step * sine);
  49.      sine:= sine + (step * cosine);
  50.    END;    
  51.  END MakeWaveArrays;
  52.  
  53. PROCEDURE MakeNoiseArray;
  54.  VAR
  55.    i: CARDINAL;
  56.  BEGIN
  57.    FOR i:=0 TO noiselen-1 BY 1 DO
  58.      (* Use a PseudoRandom number generator to get white noise *)
  59.      noise[i]:= Byte(127 - RND(256));
  60.    END;
  61.    noiseptr:= ADR(noise[0]);
  62.  END MakeNoiseArray;     
  63.   
  64. BEGIN  (* AudioDemo *)
  65.  LOOP  (* just once through, but with many EXITs *)
  66.    WriteLn;
  67.    WriteString("Demo of AudioTools. ");
  68.    WriteLn;
  69.    MakeWaveArrays;   MakeNoiseArray;
  70.    WriteLn;
  71.    myport:= InitAudio();  (* save for MayGetNote and FinishAudio *)
  72.    IF (myport = NIL) THEN WriteString("Problem in InitAudio!"); RETURN; END;  
  73.  
  74.    FOR i:= 0 TO 3 BY 1 DO 
  75.      channel:= GetChannel(-1);
  76.      IF (channel = -1) THEN WriteString("Cannot get a channel!"); EXIT; END;
  77.      error:= StopChannel(channel);
  78.      IF (error # 0) THEN WriteString("Error in stopping channel!"); EXIT; END;
  79.    END;  
  80.      WriteString("Got & Stopped 4 channels O.K.");
  81.      WriteLn;
  82.    
  83.    (*  assign waveArrays using SetWave()  *)
  84.          (* SetWave(channel, wavearray) *)
  85.    error:= SetWave(0, sawtooth);
  86.    IF (error # 0) THEN WriteString("Error in SetWave, ch 0"); EXIT; END;
  87.    error:= SetWave(1, triangle);
  88.    IF (error # 0) THEN WriteString("Error in SetWave, ch 1"); EXIT; END;
  89.    error:= SetWave(2, square);
  90.    IF (error # 0) THEN WriteString("Error in SetWave, ch 2"); EXIT; END;
  91.    error:= SetWave(3, sinewave);
  92.    IF (error # 0) THEN WriteString("Error in SetWave, ch 3"); EXIT; END;
  93.    WriteString("SetWave assigned all 4 waveforms.");
  94.    WriteLn;
  95.              
  96.    (* PlayXXXX(channel, note/freq,  vol, duration, priority,messageport, id) *)
  97.    FOR i:= 0 TO 48 BY 1 DO            (* all notes, 1/8 sec. *)
  98.      PlayFreq(0, 10*i,     32, 125, 0, NIL, 0);
  99.      PlayNote(1, 95-i,     32, 125, 0, NIL, 0);
  100.    END;
  101.    WriteString("Queued up Lo-Freq PlayNotes and PlayFreqs ");
  102.    WriteLn;
  103.     
  104.    (* SMACK IN THE MIDDLE HERE, INSTALL TEST OF MESSAGING *)
  105.    (* Make the note distinctive so we can tell for sure *)
  106.  
  107.    PlayNote(0, 3,          63, 500, 0, myport, 7);
  108.    WriteString("Queued up Test of Messaging with id = 7");
  109.    WriteLn;             
  110.    FOR i:= 50 TO 95 BY 1 DO          (* all notes, 1/8 sec. *)
  111.      PlayFreq(0, 10*i,     32, 125, 0, NIL, 0);
  112.      PlayNote(1, 95-i,     32, 125, 0, NIL, 0);
  113.    END;
  114.    WriteString("Queued up Hi-Freq PlayNotes and PlayFreqs ");
  115.    WriteLn;
  116.    
  117.    FOR i:= 0 TO 3 BY 1 DO
  118.      error:= StartChannel(i);
  119.      IF (error # 0) THEN WriteString("Error starting channel!"); EXIT; END;
  120.    END;
  121.    WriteString("Started all channels O.K.");
  122.    WriteLn; WriteLn;
  123.    
  124.    WriteString("SLEEP now - the prioritized myid will wake me up.");
  125.    WriteLn;
  126.    myid:= MayGetNote(myport, TRUE);    (* FALSE means don't sleep *)
  127.    WriteLn;
  128.    WriteString("Hey!  Note I identified as ");
  129.    IF (myid = 7) THEN WriteString("7"); ELSE WriteString("0"); END;
  130.    WriteString(" just started to play");
  131.    WriteLn; WriteLn;
  132.    
  133.    WriteString("Wait 6 seconds ... ");
  134.    Delay(300);
  135.    WriteString(" CheckIfDone ? - ");
  136.    IF (CheckIfDone() = FALSE) THEN WriteString("FALSE");
  137.    ELSE WriteString("TRUE"); END;
  138.    WriteLn; WriteLn;
  139.    WriteString("Now Queue up PlayNotes with duration > 2000.");
  140.    WriteLn;
  141.    PlayNote(0, 23,    32, 2000, 0, NIL, 0);
  142.    PlayNote(1, 27,    32, 2300, 0, NIL, 0);
  143.    PlayNote(2, 30,    32, 2600, 0, NIL, 0);
  144.    PlayNote(3, 35,    32, 2900, 0, NIL, 0);
  145.    WriteLn;
  146.    Delay(150);    (* Waits 3 seconds after letting the last note begin
  147.          * (because last note is 2900/1000ths long).
  148.          *)
  149.    WriteString("Last note should have ended... ");
  150.    WriteString("CheckIfDone ? - ");
  151.    IF (CheckIfDone() = FALSE) THEN WriteString("FALSE");
  152.     ELSE WriteString("TRUE"); END;
  153.    WriteLn; WriteLn;
  154.    
  155.    (* assign noise array to ch 0, using SetSamp() *)
  156.           (* SetSamp(channel, sampleaudio, length) *)
  157.    error:= SetSamp(0, noiseptr, noiselen);
  158.    IF (error # 0) THEN WriteString("Error in SetSamp, ch.0"); EXIT; END;
  159.    WriteString("Finally, some noise, using PlaySamp");
  160.    WriteLn;
  161.    PlaySamp(0,    327, 48, 6000, 0, NIL, 0);
  162.    (* PlaySamp(chan, samplrate, volume, 6.0sec duration, pri, msgpt, id)   *)
  163.    
  164.    FOR i:= 6 TO 1 BY -1 DO   (* try a 6 second decay of volume *)
  165.      Delay(50);
  166.      error:= SetPV(0,327, i*8);
  167.      IF (error # 0) THEN WriteString("Error in SetPV, ch.0"); EXIT; END;
  168.    END;  
  169.    (* If you take out this delay, you'll see that FinishAudio means
  170.     * FINISH AUDIO... it cuts off the notes right in the middle if necessary! *)
  171.    WriteString("Noise should have ended.");              
  172.    EXIT;              
  173.   END; (* LOOP *)
  174.   WriteLn; WriteLn;
  175.   WriteString("Ready to Finish Audio.");
  176.   WriteLn;
  177.   FinishAudio(myport);
  178.   WriteString("Done!");
  179.   WriteLn;
  180.   
  181. END AudioDemo.mod
  182.